package net.xuele.learn.rsocket;

import io.rsocket.Payload;
import io.rsocket.RSocket;
import io.rsocket.RSocketFactory;
import io.rsocket.transport.netty.client.TcpClientTransport;
import io.rsocket.util.DefaultPayload;
import org.springframework.cloud.sleuth.internal.SpanNameUtil;

/**
 * @author: patrick-Hikari
 * @description: 经典的request-response模型
 * @date: 2021/8/18 5:53 下午
 */
public class ReqResClient {

    private final RSocket rSocket;

    /**
     * 到start这一步得到的只是一个Mono，而正在得到RSocket则是在block这步
     */
    public ReqResClient() {
        // 使用RSocketFactory.connect()创建与服务器的socket连接，使用requestResponse方法向服务端发送payload
        this.rSocket = RSocketFactory.connect()
                .transport(TcpClientTransport.create("localhost", 8070))
                .start()
                .block();
    }

    public String callBlocking(String param) {
        /* DefaultPayload.create(param)是在构建参数 */
        return rSocket.requestResponse(DefaultPayload.create(param))
                /* 这一步是在解析获得到的结果*/
                .map(e -> {
                    System.out.println("received response from server");
                    return e.getDataUtf8();
                })
                .onErrorReturn("error")
                /* 阻塞等待最终的结果*/
                .block();
    }

    public void dispose() {
        this.rSocket.dispose();
    }
}
